﻿using System;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;

namespace ShopB2C.Helper {
    /// <summary>
    /// HTML处理相关类
    /// </summary>
    public class Htmls {
        /// <summary>
        /// 删除所有 HTML 标记
        /// </summary>
        /// <param name="html">删除 HTML 标记的字符串</param>
        /// <returns>删除 HTML 标记后的字符串</returns>
        public static string ClearHtml(string html) {
            if (string.IsNullOrEmpty(html)) return html;

            string regExPattern = @"<[^>]*>";
            Regex regEx = new Regex(regExPattern);
            html = regEx.Replace(html, string.Empty);
            html = html.Trim();

            return html;
        }
        /// <summary>
        /// 删除 HTML 标记并返回符号的集合
        /// </summary>
        /// <param name="html">删除 HTML 标记的字符串</param>
        /// <param name="matchs">MatchCollection 对象</param>
        /// <returns>删除 HTML 标记后的字符串</returns>
        public static string ClearHtml(string html, out MatchCollection matchs) {
            if (string.IsNullOrEmpty(html)) {
                matchs = null;
                return html;
            }

            string regExPattern = @"<[^>]*>";

            Regex regEx = new Regex(regExPattern, RegexOptions.IgnoreCase);
            MatchCollection matchCollection = regEx.Matches(html);

            foreach (System.Text.RegularExpressions.Match match in matchCollection) {
                if (match.Success) {
                    html = html.Replace(match.Groups[0].ToString(), string.Empty);
                }
            }
            matchs = matchCollection;
            html = html.Trim();

            return html;
        }
        /// <summary>
        /// 文本支持 HTML 格式
        /// </summary>
        /// <param name="html">转换的文本</param>
        /// <returns>转换后的文本</returns>
        public static string EncodeHtml(string html) {
            if (string.IsNullOrEmpty(html)) return html;

            html = HttpUtility.HtmlEncode(html);
            // 左尖括号（<）替换
            html = Regex.Replace(html, @"<", "&lt;");
            // 右尖括号（>）替换
            html = Regex.Replace(html, @">", "&gt;");
            // 单引号（'）替换，ASCII[39]，16进制[27]
            html = Regex.Replace(html, @"\x27", "&prime;");
            // 双引号（"）替换，ASCII[34]，16进制[22]
            html = Regex.Replace(html, @"\x22", "&quot;");
            // 空格（ ）替换，ASCII[32]，16进制[20]
            html = Regex.Replace(html, @"\x20", "&nbsp;");
            // Tab 键替换，ASCII[09]，16进制[09]
            html = Regex.Replace(html, @"\x09", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
            // 换行替换
            html = Regex.Replace(html, @"\r\n", "<br />");
            // 回车替换
            html = Regex.Replace(html, @"\r\n\r\n", "<br /><br />");

            return html;
        }
        /// <summary>
        /// HTML 格式转换成文本
        /// 转换后的文本是再次放入 textarea 或类似的对象
        /// </summary>
        /// <param name="html">转换的文本</param>
        /// <returns>转换后的文本</returns>
        public static string DecodeHtml(string html) {
            if (string.IsNullOrEmpty(html)) return html;

            // 左尖括号（<）替换
            html = html.Replace("&lt;", "<");
            // 右尖括号（>）替换
            html = html.Replace("&gt;", ">");
            // 单引号（'）替换，ASCII[39]，16进制[27]
            html = html.Replace("&prime;", ((char)39).ToString());
            // 双引号（"）替换，ASCII[34]，16进制[22]
            html = html.Replace("&quot;", ((char)34).ToString());
            // 空格（ ）替换，ASCII[32]，16进制[20]
            html = html.Replace("&nbsp;", ((char)32).ToString());
            // 换行替换
            html = Regex.Replace(html, "<br />", "\r\n");
            // 回车替换
            html = Regex.Replace(html, "<br /><br />", "\r\n\r\n");

            html = HttpUtility.HtmlDecode(html);

            return html;
        }
        /// <summary>
        /// HTML 格式转换成文本
        /// 转换后的文本是 Label,Literal 的 Text 属性
        /// </summary>
        /// <param name="html">转换的文本</param>
        /// <returns>转换后的文本</returns>
        public static string DecodeHtmlText(string html) {
            string stringMatch = string.Empty;

            if (string.IsNullOrEmpty(html)) return html;

            // 左尖括号（<）替换
            html = html.Replace("&lt;", "<");
            // 右尖括号（>）替换
            html = html.Replace("&gt;", ">");
            // 单引号（'）替换，ASCII[39]，16进制[27]
            html = html.Replace("&prime;", ((char)39).ToString());
            // 双引号（"）替换，ASCII[34]，16进制[22]
            html = html.Replace("&quot;", ((char)34).ToString());
            // 空格（ ）替换，ASCII[32]，16进制[20]
            // 如果在HTML中，则替换&nbsp;，其它则不替换
            foreach (Match match in Regex.Matches(html, @"<[^>]*>")) {
                stringMatch = match.Groups[0].ToString();
                html = html.Replace(stringMatch, stringMatch.Replace("&nbsp;", ((char)32).ToString()));
            }

            html = HttpUtility.HtmlDecode(html);

            return html;
        }
    }
}
